package br.com.documentos.model.service;

import java.util.Calendar;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.documentos.model.entity.Usuario;
import br.com.documentos.model.entity.enuns.StatusUsuario;
import br.com.documentos.model.exceptions.UsuarioJaCadastradoException;
import br.com.documentos.model.persistence.UsuarioRepository;
import br.com.documentos.model.util.CriptografiaUtil;

@Service
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public class UsuarioService {

	@Autowired
	private UsuarioRepository usuarioRepository;
	
	@Autowired
	private TipoDocumentoService tipoDocumentoService;
		
	public void cadastrar( Usuario usuario )
	{
		usuario.setEmail( usuario.getEmail().toLowerCase().trim() );
		
		if( ! existeEmailCadastrado(usuario.getEmail()) )
		{
			usuario.setDataCadastro(Calendar.getInstance());
			usuario.setSenha( CriptografiaUtil.encriptarMD5(usuario.getSenha()) );
			usuario.setStatus(StatusUsuario.AGUARDANDO_ATIVACAO);
			
			usuarioRepository.save(usuario);

			tipoDocumentoService.preencheTiposPadraoParaNovoUsuario(usuario);
		}
		else {
			throw new UsuarioJaCadastradoException();
		}
	}
	
	public void alterarSenha( Usuario usuario, String novaSenha ){
		usuario.setSenha( CriptografiaUtil.encriptarMD5(novaSenha) );
	}
	
	public boolean existeEmailCadastrado( String email ){
		Usuario usuario = usuarioRepository.buscarPorEmail(email);
		return usuario != null && usuario.getId() != null;
	}
	
	public Usuario buscarPorEmail( String email ){
		return usuarioRepository.buscarPorEmail(email);
	}
	
	public boolean limiteTentativaAcessoExcedido( long idUsuario, String ip )
	{
		Usuario usuario = usuarioRepository.load(idUsuario);
		return usuario.limiteTentativaAcessoExcedido(ip, Calendar.getInstance());
	}
	
	@Transactional(propagation=Propagation.REQUIRES_NEW, rollbackFor=Exception.class, readOnly=false)
	public void adicionarTentativaAcesso( long idUsuario, String ip, boolean autorizado )
	{
		Usuario usuario = usuarioRepository.load(idUsuario);
		usuario.addHistorioAcesso(Calendar.getInstance(), ip, autorizado);
	}

}
